package com.zh.config;


import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * shiro配置类
 * shiro 三大对象：
 *  1, subject:   用户
 *  2，SecurityManage: 安全管理器，管理所有用户
 *  3, Realm: 连接数据
 */
@Configuration
public class ShiroConfig {

    //3, ShiroFilterFactoryBean,
    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager securityManager){
        //因为 下面方法改变了类名的默认参数，所以@Qualifier 的参数和改变后的值一致
        ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
        // 绑定 安全管理器
        bean.setSecurityManager(securityManager);

        //添加shiro的内置过滤器
        /**
         * anon: 无需认证 就可以访问
         * authc: 必须认证才能访问
         * user: 必须有记住我功能 才能访问
         * perms: 必须拥有某个资源的权限 才能访问
         * role: 必须拥有某个角色 才能访问
         */
        //登录拦截设置
        Map<String, String> filterMap = new LinkedHashMap();
        filterMap.put("/user/add","authc");
        filterMap.put("/user/update","authc");
        bean.setFilterChainDefinitionMap(filterMap);

        //设置 登录的请求
        bean.setLoginUrl("/toLogin");


        return bean;
    }

    //2, DefaultWebSecurityManage 管理器：管理所有subject,
    @Bean(name = "securityManager") // 可以使用name 改变默认参数
    public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("myRealm") MyRealm myRealm){
        //@Qualifier("myRealm") 注解主要是 关联下面的Myreaml.参数默认为方法名。
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();

        //关联 自定义realm
        securityManager.setRealm(myRealm);
        return securityManager;
    }

    //1, 创建 realm 对象，需要自定义
    @Bean //@Bean 交给springioc 管理
    public MyRealm myRealm(){
        return new MyRealm();
    }
}
